package org.example.jedis.key;

import org.example.jedis.JedisDemo;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

/**
 * redis的key命令学习
 * @author: tianhao.luo@hand-china.com 2021/5/24  10:59
 */
public class KeyControlTest extends JedisDemo {


    /**
     * 命令:set key value
     * 给键key生成值value
     */
    @Test
    public void setKeyValue(){
        String key = "topn";
        String value = "hello world";
        delExistsKeyValue(key);
        String set = jedis.set(key, value);
        LOGGER.info("添加的key为:{},value为:{},结果为:{}",key,value,set);
    }


    /**
     * 命令:keys *
     * 获取当前库下所有的key
     */
    @Test
    public void keys(){
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            LOGGER.info("key:{}",key);
        }
    }

    /**
     * 命令:exists key
     * 判断当前key是否存在;返回1表示存在,返回0表示不存在
     */
    @Test
    public void existsKey(){
        String key = "topn";
        if (jedis.exists(key)) {
            LOGGER.info("db:{}中存在key:{}",jedis.getDB(),key);
        }else {
            LOGGER.info("db:{}中不存在key:{}",jedis.getDB(),key);
        }
    }

    /**
     * 命令:type key
     * 判断当前key存储的value数据类型
     */
    @Test
    public void typeKey(){
        String key = "topn";
        String keyType = jedis.type(key);
        LOGGER.info("key:{}的数据类型:{}",key,keyType);
    }


    /**
     * 命令:del key
     * 删除指定的key数据，删除了几个key返回几
     */
    @Test
    public void delKey(){
        String key = "topn";
        Long del = jedis.del(key);
        LOGGER.info("删除的key:{},删除结果为:{}",key,del);
    }


    /**
     * 命令:unlink key
     * 根据key选择非阻塞删除,仅将key从keyspace元数据中删除,真正的删除在后续异步操作中
     */
    @Test
    public void unlinkKey(){
        String key = "topn";
        Long unlink = jedis.unlink(key);
        LOGGER.info("删除的key:{},删除结果为:{}",key,unlink);
    }

    /**
     * 命令:expire key seconds
     * 为key设置过期时间，设置成功返回1
     *
     * 命令:ttl key
     * 监听key还有多少时间过期,-1永不过期,正数表示还差多少秒过期;-2表示已经过期
     */
    @Test
    public void expireKeySecondsAndTtl(){
        String key = "topn";
        Long expire = jedis.expire(key, 30L);
        LOGGER.info("设置过期时间的key:{},结果为:{}",key,expire);
        Long ttl = jedis.ttl(key);
        LOGGER.info("获取过期时间的key:{},结果为:{}",key,ttl);
    }


    /**
     * 命令:select index
     * 切换到指定index数据库,成功返回ok
     */
    @Test
    public void selectIndex(){
        String select = jedis.select(1);
        LOGGER.info("切换数据库:{}",select);
    }

    /**
     * 命令:dbSize
     * 查看当前库下所有的key的数量
     */
    @Test
    public void dbSize(){
        Long aLong = jedis.dbSize();
        LOGGER.info("当前数据库中的key的数量:{}",aLong);
    }


    /**
     * 命令:flushdb
     * 清空当前数据库下的所有key,成功返回ok
     */
    @Test
    public void flushDb(){
        String s = jedis.flushDB();
        LOGGER.info("清空当前数据库:{}",s);
    }


    /**
     * 命令:flushAll
     * 清空所有数据库下的所有key,成功返回ok
     */
    @Test
    public void flushAll(){
        String s = jedis.flushAll();
        LOGGER.info("清空所有数据库:{}",s);
    }
}
